Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / androidApp / src / google / kotlin / org / meshtastic / app / analytics / GooglePlatformAnalytics.kt

Displaying Raw • Download

androidApp/src/google/kotlin/org/meshtastic/app/analytics/GooglePlatformAnalytics.kt 034005b4fa5c8b34761c4ed5d85f0d3ebd4345d8 (034005b4) Text, 14.89 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.app.analytics

Tff7b72import T7ee787android.app.Application
Tff7b72import T7ee787android.content.Context
Tff7b72import T7ee787android.os.Bundle
Tff7b72import T7ee787android.provider.Settings
Tff7b72import T7ee787androidx.lifecycle.ProcessLifecycleOwner
Tff7b72import T7ee787androidx.lifecycle.lifecycleScope
Tff7b72import T7ee787co.touchlab.kermit.LogWriter
Tff7b72import T7ee787co.touchlab.kermit.Severity
Tff7b72import T7ee787com.datadog.android.Datadog
Tff7b72import T7ee787com.datadog.android.DatadogSite
Tff7b72import T7ee787com.datadog.android.core.configuration.Configuration
Tff7b72import T7ee787com.datadog.android.log.Logger
Tff7b72import T7ee787com.datadog.android.log.Logs
Tff7b72import T7ee787com.datadog.android.log.LogsConfiguration
Tff7b72import T7ee787com.datadog.android.privacy.TrackingConsent
Tff7b72import T7ee787com.datadog.android.rum.GlobalRumMonitor
Tff7b72import T7ee787com.datadog.android.rum.Rum
Tff7b72import T7ee787com.datadog.android.rum.RumActionType
Tff7b72import T7ee787com.datadog.android.rum.RumConfiguration
Tff7b72import T7ee787com.datadog.android.sessionreplay.SessionReplay
Tff7b72import T7ee787com.datadog.android.sessionreplay.SessionReplayConfiguration
Tff7b72import T7ee787com.datadog.android.sessionreplay.TextAndInputPrivacy
Tff7b72import T7ee787com.datadog.android.trace.Trace
Tff7b72import T7ee787com.datadog.android.trace.TraceConfiguration
Tff7b72import T7ee787com.datadog.android.trace.opentelemetry.DatadogOpenTelemetry
Tff7b72import T7ee787com.google.android.gms.common.ConnectionResult
Tff7b72import T7ee787com.google.android.gms.common.GoogleApiAvailabilityLight
Tff7b72import T7ee787com.google.firebase.Firebase
Tff7b72import T7ee787com.google.firebase.analytics.FirebaseAnalytics.ConsentStatus
Tff7b72import T7ee787com.google.firebase.analytics.FirebaseAnalytics.ConsentType
Tff7b72import T7ee787com.google.firebase.analytics.analytics
Tff7b72import T7ee787com.google.firebase.crashlytics.crashlytics
Tff7b72import T7ee787com.google.firebase.crashlytics.setCustomKeys
Tff7b72import T7ee787com.google.firebase.initialize
Tff7b72import T7ee787io.opentelemetry.api.GlobalOpenTelemetry
Tff7b72import T7ee787kotlinx.coroutines.CancellationException
Tff7b72import T7ee787kotlinx.coroutines.flow.launchIn
Tff7b72import T7ee787kotlinx.coroutines.flow.onEach
Tff7b72import T7ee787org.koin.core.annotation.Single
Tff7b72import T7ee787org.meshtastic.app.BuildConfig
Tff7b72import T7ee787org.meshtastic.core.repository.AnalyticsPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.DataPair
Tff7b72import T7ee787org.meshtastic.core.repository.PlatformAnalytics
Tff7b72import T7ee787co.touchlab.kermit.Logger Tff7b72as Te6edf3KermitLogger

T8b949e/**
* Google Play Services specific implementation of [PlatformAnalytics]. This helper initializes and manages Firebase and
* Datadog services, and subscribes to analytics preference changes to update consent accordingly.
*
* This implementation delays initialization of SDKs until user consent is granted to reduce tracking "noise" and
* respect privacy-focused environments.
*/
Tf0883e@Single
Tff7b72class T56d364GooglePlatformAnalyticsTb4b4b4(Tff7b72private Tff7b72val Te6edf3contextTb4b4b4: Te6edf3ContextTb4b4b4, Tff7b72private Tff7b72val Te6edf3analyticsPrefsTb4b4b4: Te6edf3AnalyticsPrefsTb4b4b4) Tb4b4b4:
Te6edf3PlatformAnalytics Tb4b4b4{

Tff7b72private Tff7b72val Te6edf3sampleRate Tff7b72= T79c0ff1T79c0ff0T79c0ff0f T8b949e// Match Apple: 100% sampling for cross-platform DataDog comparison

Tff7b72private Tff7b72var Te6edf3datadogLoggerTb4b4b4: Te6edf3Logger? Tff7b72= Tff7b72null
Tff7b72private Tff7b72var Te6edf3isFirebaseInitialized Tff7b72= Tff7b72false

Tff7b72private Tff7b72val Te6edf3isInTestLabTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3testLabSetting Tff7b72= Te6edf3SettingsTb4b4b4.Te6edf3SystemTb4b4b4.Te6edf3getStringTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3contentResolverTb4b4b4, Ta5d6ff"Ta5d6fffirebase.test.labTa5d6ff"Tb4b4b4)
Tff7b72return Ta5d6ff"Ta5d6fftrueTa5d6ff" Tff7b72=Tff7b72= Te6edf3testLabSetting
Tb4b4b4}

Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3TAG Tff7b72= Ta5d6ff"Ta5d6ffGooglePlatformAnalyticsTa5d6ff"
Tff7b72private Tff7b72const Tff7b72val Te6edf3SERVICE_NAME Tff7b72= Ta5d6ff"Ta5d6fforg.meshtasticTa5d6ff"

Tff7b72private Tff7b72const Tff7b72val Te6edf3KEY_PRIORITY Tff7b72= Ta5d6ff"Ta5d6ffpriorityTa5d6ff"
Tff7b72private Tff7b72const Tff7b72val Te6edf3KEY_TAG Tff7b72= Ta5d6ff"Ta5d6fftagTa5d6ff"
Tff7b72private Tff7b72const Tff7b72val Te6edf3KEY_MESSAGE Tff7b72= Ta5d6ff"Ta5d6ffmessageTa5d6ff"
Tb4b4b4}

Tff7b72init Tb4b4b4{
T8b949e// Setup Kermit log writers immediately, they will handle delayed SDK initialization gracefully.
Tff7b72val Te6edf3writers Tff7b72= Te6edf3buildList Tb4b4b4{
Te6edf3addTb4b4b4(Te6edf3DatadogLogWriterTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3addTb4b4b4(Te6edf3CrashlyticsLogWriterTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTb4b4b4) Tb4b4b4{
Te6edf3addTb4b4b4(Te6edf3coTb4b4b4.Te6edf3touchlabTb4b4b4.Te6edf3kermitTb4b4b4.Te6edf3LogcatWriterTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3KermitLoggerTb4b4b4.Te6edf3setLogWritersTb4b4b4(Te6edf3writersTb4b4b4)
Te6edf3KermitLoggerTb4b4b4.Te6edf3setMinSeverityTb4b4b4(Tff7b72if Tb4b4b4(Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTb4b4b4) Te6edf3SeverityTb4b4b4.Te6edf3Debug Tff7b72else Te6edf3SeverityTb4b4b4.Te6edf3InfoTb4b4b4)

T8b949e// Initial consent state
Te6edf3updateAnalyticsConsentTb4b4b4(Te6edf3analyticsPrefsTb4b4b4.Te6edf3analyticsAllowedTb4b4b4.Te6edf3valueTb4b4b4)

T8b949e// Subscribe to analytics preference changes
Te6edf3analyticsPrefsTb4b4b4.Te6edf3analyticsAllowed
Tb4b4b4.Te6edf3onEach Tb4b4b4{ Te6edf3allowed Tff7b72-Tff7b72> Te6edf3updateAnalyticsConsentTb4b4b4(Te6edf3allowedTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3launchInTb4b4b4(Te6edf3ProcessLifecycleOwnerTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3lifecycleScopeTb4b4b4)
Tb4b4b4}

T8b949e/**
* Ensures that Datadog and Firebase SDKs are initialized if allowed. This is called lazily when consent is granted.
*/
Tff7b72private Tff7b72fun Td2a8ffensureInitializedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3analyticsPrefsTb4b4b4.Te6edf3analyticsAllowedTb4b4b4.Te6edf3value Tff7b72|Tff7b72| Te6edf3isInTestLabTb4b4b4) Tff7b72return

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3DatadogTb4b4b4.Te6edf3isInitializedTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3initDatadogTb4b4b4(Te6edf3context Tff7b72as Te6edf3ApplicationTb4b4b4)
Te6edf3datadogLogger Tff7b72=
Te6edf3LoggerTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setServiceTb4b4b4(Te6edf3SERVICE_NAMETb4b4b4)
Tb4b4b4.Te6edf3setNetworkInfoEnabledTb4b4b4(Tff7b72falseTb4b4b4) T8b949e// Disable to avoid collecting Local IP/SSID
Tb4b4b4.Te6edf3setRemoteSampleRateTb4b4b4(Te6edf3sampleRateTb4b4b4)
Tb4b4b4.Te6edf3setBundleWithTraceEnabledTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3setBundleWithRumEnabledTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isFirebaseInitializedTb4b4b4) Tb4b4b4{
Te6edf3initCrashlyticsTb4b4b4(Te6edf3context Tff7b72as Te6edf3ApplicationTb4b4b4)
Te6edf3isFirebaseInitialized Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffinitDatadogTb4b4b4(Te6edf3applicationTb4b4b4: Te6edf3ApplicationTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3configuration Tff7b72=
Te6edf3ConfigurationTb4b4b4.Te6edf3BuilderTb4b4b4(
Te6edf3clientToken Tff7b72= Te6edf3BuildConfigTb4b4b4.Te6edf3datadogClientTokenTb4b4b4,
Te6edf3env Tff7b72= Tff7b72if Tb4b4b4(Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTb4b4b4) Ta5d6ff"Ta5d6ffLocalTa5d6ff" Tff7b72else Ta5d6ff"Ta5d6ffProductionTa5d6ff"Tb4b4b4,
Te6edf3variant Tff7b72= Te6edf3BuildConfigTb4b4b4.Te6edf3FLAVORTb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3useSiteTb4b4b4(Te6edf3DatadogSiteTb4b4b4.Te6edf3US5Tb4b4b4)
Tb4b4b4.Te6edf3setCrashReportsEnabledTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3setUseDeveloperModeWhenDebuggableTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
T8b949e// Initialize with PENDING, consent will be updated via updateAnalyticsConsent
Te6edf3DatadogTb4b4b4.Te6edf3initializeTb4b4b4(Te6edf3applicationTb4b4b4, Te6edf3configurationTb4b4b4, Te6edf3TrackingConsentTb4b4b4.Te6edf3PENDINGTb4b4b4)
Te6edf3DatadogTb4b4b4.Te6edf3setVerbosityTb4b4b4(Tff7b72if Tb4b4b4(Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTb4b4b4) Te6edf3androidTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3LogTb4b4b4.Te6edf3DEBUG Tff7b72else Te6edf3androidTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3LogTb4b4b4.Te6edf3WARNTb4b4b4)

Tff7b72val Te6edf3rumConfiguration Tff7b72=
Te6edf3RumConfigurationTb4b4b4.Te6edf3BuilderTb4b4b4(Te6edf3BuildConfigTb4b4b4.Te6edf3datadogApplicationIdTb4b4b4)
Tb4b4b4.Te6edf3trackAnonymousUserTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3trackBackgroundEventsTb4b4b4(Tff7b72trueTb4b4b4) T8b949e// Match Apple: track background events for cross-platform parity
Tb4b4b4.Te6edf3trackFrustrationsTb4b4b4(Tff7b72falseTb4b4b4) T8b949e// Disable click-tracking based frustration detection
Tb4b4b4.Te6edf3trackLongTasksTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3trackNonFatalAnrsTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3setSessionSampleRateTb4b4b4(Te6edf3sampleRateTb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Te6edf3RumTb4b4b4.Te6edf3enableTb4b4b4(Te6edf3rumConfigurationTb4b4b4)

Tff7b72val Te6edf3logsConfig Tff7b72= Te6edf3LogsConfigurationTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Te6edf3LogsTb4b4b4.Te6edf3enableTb4b4b4(Te6edf3logsConfigTb4b4b4)

Tff7b72val Te6edf3traceConfig Tff7b72= Te6edf3TraceConfigurationTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setNetworkInfoEnabledTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Te6edf3TraceTb4b4b4.Te6edf3enableTb4b4b4(Te6edf3traceConfigTb4b4b4)

T8b949e// Session Replay for debug builds only, matching Apple's TestFlight-only gating.
T8b949e// Masks all text inputs to protect message content.
Tff7b72if Tb4b4b4(Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3sessionReplayConfig Tff7b72=
Te6edf3SessionReplayConfigurationTb4b4b4.Te6edf3BuilderTb4b4b4(Te6edf3sampleRateTb4b4b4)
Tb4b4b4.Te6edf3setTextAndInputPrivacyTb4b4b4(Te6edf3TextAndInputPrivacyTb4b4b4.Te6edf3MASK_ALL_INPUTSTb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Te6edf3SessionReplayTb4b4b4.Te6edf3enableTb4b4b4(Te6edf3sessionReplayConfigTb4b4b4)
Tb4b4b4}

Te6edf3GlobalOpenTelemetryTb4b4b4.Te6edf3setTb4b4b4(Te6edf3DatadogOpenTelemetryTb4b4b4(Te6edf3serviceName Tff7b72= Te6edf3SERVICE_NAMETb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffinitCrashlyticsTb4b4b4(Te6edf3applicationTb4b4b4: Te6edf3ApplicationTb4b4b4) Tb4b4b4{
Te6edf3FirebaseTb4b4b4.Te6edf3initializeTb4b4b4(Te6edf3applicationTb4b4b4)

T8b949e// Deny all ad-related consent types by default to minimize tracking noise
Te6edf3FirebaseTb4b4b4.Te6edf3analyticsTb4b4b4.Te6edf3setConsentTb4b4b4(
Te6edf3mapOfTb4b4b4(
Te6edf3ConsentTypeTb4b4b4.Te6edf3AD_STORAGE Te6edf3to Te6edf3ConsentStatusTb4b4b4.Te6edf3DENIEDTb4b4b4,
Te6edf3ConsentTypeTb4b4b4.Te6edf3AD_USER_DATA Te6edf3to Te6edf3ConsentStatusTb4b4b4.Te6edf3DENIEDTb4b4b4,
Te6edf3ConsentTypeTb4b4b4.Te6edf3AD_PERSONALIZATION Te6edf3to Te6edf3ConsentStatusTb4b4b4.Te6edf3DENIEDTb4b4b4,
Te6edf3ConsentTypeTb4b4b4.Te6edf3ANALYTICS_STORAGE Te6edf3to Te6edf3ConsentStatusTb4b4b4.Te6edf3DENIEDTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

T8b949e// Explicitly disable analytics collection until we confirm user consent
Te6edf3FirebaseTb4b4b4.Te6edf3analyticsTb4b4b4.Te6edf3setAnalyticsCollectionEnabledTb4b4b4(Tff7b72falseTb4b4b4)
Tb4b4b4}

T8b949e/**
* Updates the consent status for analytics, performance, and crash reporting services.
*
* @param allowed True if analytics are allowed, false otherwise.
*/
Tff7b72fun Td2a8ffupdateAnalyticsConsentTb4b4b4(Te6edf3allowedTb4b4b4: Tffa657BooleanTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isInTestLabTb4b4b4) Tff7b72return

Tff7b72if Tb4b4b4(Te6edf3allowedTb4b4b4) Tb4b4b4{
Te6edf3ensureInitializedTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3KermitLoggerTb4b4b4.Te6edf3i Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3allowedTb4b4b4) Ta5d6ff"Ta5d6ffAnalytics enabledTa5d6ff" Tff7b72else Ta5d6ff"Ta5d6ffAnalytics disabledTa5d6ff" Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3DatadogTb4b4b4.Te6edf3isInitializedTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3DatadogTb4b4b4.Te6edf3setTrackingConsentTb4b4b4(Tff7b72if Tb4b4b4(Te6edf3allowedTb4b4b4) Te6edf3TrackingConsentTb4b4b4.Te6edf3GRANTED Tff7b72else Te6edf3TrackingConsentTb4b4b4.Te6edf3NOT_GRANTEDTb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3isFirebaseInitializedTb4b4b4) Tb4b4b4{
Te6edf3FirebaseTb4b4b4.Te6edf3crashlyticsTb4b4b4.Te6edf3isCrashlyticsCollectionEnabled Tff7b72= Te6edf3allowed
Te6edf3FirebaseTb4b4b4.Te6edf3analyticsTb4b4b4.Te6edf3setAnalyticsCollectionEnabledTb4b4b4(Te6edf3allowedTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3allowedTb4b4b4) Tb4b4b4{
Te6edf3FirebaseTb4b4b4.Te6edf3crashlyticsTb4b4b4.Te6edf3sendUnsentReportsTb4b4b4(Tb4b4b4)
T8b949e// Ensure ad-related PII collection remains disabled even if analytics is allowed
Te6edf3FirebaseTb4b4b4.Te6edf3analyticsTb4b4b4.Te6edf3setUserPropertyTb4b4b4(Ta5d6ff"Ta5d6ffallow_personalized_adsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffalseTa5d6ff"Tb4b4b4)
Tb4b4b4}

T8b949e// Manage Analytics Storage consent for Advanced Consent Mode
Tff7b72val Te6edf3consentStatus Tff7b72= Tff7b72if Tb4b4b4(Te6edf3allowedTb4b4b4) Te6edf3ConsentStatusTb4b4b4.Te6edf3GRANTED Tff7b72else Te6edf3ConsentStatusTb4b4b4.Te6edf3DENIED
Te6edf3FirebaseTb4b4b4.Te6edf3analyticsTb4b4b4.Te6edf3setConsentTb4b4b4(
Te6edf3mapOfTb4b4b4(
Te6edf3ConsentTypeTb4b4b4.Te6edf3ANALYTICS_STORAGE Te6edf3to Te6edf3consentStatusTb4b4b4,
T8b949e// Keep ad-related types explicitly denied
Te6edf3ConsentTypeTb4b4b4.Te6edf3AD_STORAGE Te6edf3to Te6edf3ConsentStatusTb4b4b4.Te6edf3DENIEDTb4b4b4,
Te6edf3ConsentTypeTb4b4b4.Te6edf3AD_USER_DATA Te6edf3to Te6edf3ConsentStatusTb4b4b4.Te6edf3DENIEDTb4b4b4,
Te6edf3ConsentTypeTb4b4b4.Te6edf3AD_PERSONALIZATION Te6edf3to Te6edf3ConsentStatusTb4b4b4.Te6edf3DENIEDTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffsetDeviceAttributesTb4b4b4(Te6edf3firmwareVersionTb4b4b4: Tffa657StringTb4b4b4, Te6edf3modelTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3DatadogTb4b4b4.Te6edf3isInitializedTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Tff7b72!Te6edf3GlobalRumMonitorTb4b4b4.Te6edf3isRegisteredTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return
Te6edf3GlobalRumMonitorTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3addAttributeTb4b4b4(Ta5d6ff"Ta5d6fffirmware_versionTa5d6ff"Tb4b4b4, Te6edf3firmwareVersionTb4b4b4.Te6edf3extractSemanticVersionTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3GlobalRumMonitorTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3addAttributeTb4b4b4(Ta5d6ff"Ta5d6ffdevice_hardwareTa5d6ff"Tb4b4b4, Te6edf3modelTb4b4b4)
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8fftrackConnectTb4b4b4(
Te6edf3firmwareVersionTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3transportTypeTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3hardwareModelTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3nodesTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3connectionRestoredTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3DatadogTb4b4b4.Te6edf3isInitializedTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Tff7b72!Te6edf3GlobalRumMonitorTb4b4b4.Te6edf3isRegisteredTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return
Tff7b72val Te6edf3attributes Tff7b72= Te6edf3buildMap Tb4b4b4{
Te6edf3firmwareVersionTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6fffirmwareVersionTa5d6ff"Tb4b4b4, Tffa657itTb4b4b4) Tb4b4b4}
Te6edf3transportTypeTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6fftransportTypeTa5d6ff"Tb4b4b4, Tffa657itTb4b4b4) Tb4b4b4}
Te6edf3hardwareModelTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffhardwareModelTa5d6ff"Tb4b4b4, Tffa657itTb4b4b4) Tb4b4b4}
Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffnodesTa5d6ff"Tb4b4b4, Te6edf3nodesTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3connectionRestoredTb4b4b4) Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffconnectionRestoredTa5d6ff"Tb4b4b4, Tff7b72trueTb4b4b4)
Tb4b4b4}
Te6edf3GlobalRumMonitorTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3addActionTb4b4b4(Te6edf3RumActionTypeTb4b4b4.Te6edf3CUSTOMTb4b4b4, Ta5d6ff"Ta5d6ffconnectTa5d6ff"Tb4b4b4, Te6edf3attributesTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72val Te6edf3isGooglePlayAvailableTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72=
Te6edf3GoogleApiAvailabilityLightTb4b4b4.Te6edf3getInstanceTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3isGooglePlayServicesAvailableTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3let Tb4b4b4{
Tffa657it Tff7b72!Tff7b72= Te6edf3ConnectionResultTb4b4b4.Te6edf3SERVICE_MISSING Tff7b72&Tff7b72& Tffa657it Tff7b72!Tff7b72= Te6edf3ConnectionResultTb4b4b4.Te6edf3SERVICE_INVALID
Tb4b4b4}

Tff7b72override Tff7b72val Te6edf3isPlatformServicesAvailableTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3isGooglePlayAvailable

Tff7b72private Tff7b72inner Tff7b72class T56d364CrashlyticsLogWriter Tb4b4b4: Te6edf3LogWriterTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8fflogTb4b4b4(Te6edf3severityTb4b4b4: Te6edf3SeverityTb4b4b4, Te6edf3messageTb4b4b4: Tffa657StringTb4b4b4, Te6edf3tagTb4b4b4: Tffa657StringTb4b4b4, Te6edf3throwableTb4b4b4: Te6edf3Throwable?Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isFirebaseInitializedTb4b4b4) Tff7b72return
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3FirebaseTb4b4b4.Te6edf3crashlyticsTb4b4b4.Te6edf3isCrashlyticsCollectionEnabledTb4b4b4) Tff7b72return

T8b949e// Add the log to the Crashlytics log buffer so it appears in reports
Te6edf3FirebaseTb4b4b4.Te6edf3crashlyticsTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Tffd700$Te6edf3severityTa5d6ff/Tffd700$Te6edf3tagTa5d6ff: Tffd700$Te6edf3messageTa5d6ff"Tb4b4b4)

T8b949e// Filter out normal coroutine cancellations
Tff7b72if Tb4b4b4(Te6edf3throwable Tff7b72is Te6edf3CancellationExceptionTb4b4b4) Tff7b72return

T8b949e// Only record non-fatal exceptions for actual Errors (Severity.Error or Severity.Assert)
Tff7b72if Tb4b4b4(Te6edf3severity Tff7b72>Tff7b72= Te6edf3SeverityTb4b4b4.Te6edf3ErrorTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3throwable Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3FirebaseTb4b4b4.Te6edf3crashlyticsTb4b4b4.Te6edf3recordExceptionTb4b4b4(Te6edf3throwableTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3FirebaseTb4b4b4.Te6edf3crashlyticsTb4b4b4.Te6edf3setCustomKeys Tb4b4b4{
Te6edf3keyTb4b4b4(Te6edf3KEY_PRIORITYTb4b4b4, Te6edf3severityTb4b4b4.Te6edf3ordinalTb4b4b4)
Te6edf3keyTb4b4b4(Te6edf3KEY_TAGTb4b4b4, Te6edf3tagTb4b4b4)
Te6edf3keyTb4b4b4(Te6edf3KEY_MESSAGETb4b4b4, Te6edf3messageTb4b4b4)
Tb4b4b4}
Te6edf3FirebaseTb4b4b4.Te6edf3crashlyticsTb4b4b4.Te6edf3recordExceptionTb4b4b4(Te6edf3ExceptionTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72inner Tff7b72class T56d364DatadogLogWriter Tb4b4b4: Te6edf3LogWriterTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8fflogTb4b4b4(Te6edf3severityTb4b4b4: Te6edf3SeverityTb4b4b4, Te6edf3messageTb4b4b4: Tffa657StringTb4b4b4, Te6edf3tagTb4b4b4: Tffa657StringTb4b4b4, Te6edf3throwableTb4b4b4: Te6edf3Throwable?Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3logger Tff7b72= Te6edf3datadogLogger Tff7b72?: Tff7b72return
Tff7b72val Te6edf3datadogPriority Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3severityTb4b4b4) Tb4b4b4{
Te6edf3SeverityTb4b4b4.Te6edf3Verbose Tff7b72-Tff7b72> Te6edf3androidTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3LogTb4b4b4.Te6edf3VERBOSE
Te6edf3SeverityTb4b4b4.Te6edf3Debug Tff7b72-Tff7b72> Te6edf3androidTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3LogTb4b4b4.Te6edf3DEBUG
Te6edf3SeverityTb4b4b4.Te6edf3Info Tff7b72-Tff7b72> Te6edf3androidTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3LogTb4b4b4.Te6edf3INFO
Te6edf3SeverityTb4b4b4.Te6edf3Warn Tff7b72-Tff7b72> Te6edf3androidTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3LogTb4b4b4.Te6edf3WARN
Te6edf3SeverityTb4b4b4.Te6edf3Error Tff7b72-Tff7b72> Te6edf3androidTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3LogTb4b4b4.Te6edf3ERROR
Te6edf3SeverityTb4b4b4.Te6edf3Assert Tff7b72-Tff7b72> Te6edf3androidTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3LogTb4b4b4.Te6edf3ASSERT
Tb4b4b4}
Te6edf3loggerTb4b4b4.Te6edf3logTb4b4b4(Te6edf3datadogPriorityTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3throwableTb4b4b4, Te6edf3mapOfTb4b4b4(Ta5d6ff"Ta5d6fftagTa5d6ff" Te6edf3to Te6edf3tagTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3StringTb4b4b4.Td2a8ffextractSemanticVersionTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3regex Tff7b72= Ta5d6ff"Ta5d6ff^(Ta5d6ff\\Ta5d6ffd+)(?:Ta5d6ff\\Ta5d6ff.(Ta5d6ff\\Ta5d6ffd+))?(?:Ta5d6ff\\Ta5d6ff.(Ta5d6ff\\Ta5d6ffd+))?$Ta5d6ff"Tb4b4b4.Te6edf3toRegexTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3matchResult Tff7b72= Te6edf3regexTb4b4b4.Te6edf3findTb4b4b4(Tff7b72thisTb4b4b4)
Tff7b72return Te6edf3matchResultTff7b72?.Te6edf3groupValuesTff7b72?.Te6edf3dropTb4b4b4(T79c0ff1Tb4b4b4)Tff7b72?.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tb4b4b4}Tff7b72?.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4) Tff7b72?: Tff7b72this
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8fftrackTb4b4b4(Te6edf3eventTb4b4b4: Tffa657StringTb4b4b4, Tff7b72vararg Te6edf3propertiesTb4b4b4: Te6edf3DataPairTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isFirebaseInitializedTb4b4b4) Tff7b72return
Tff7b72val Te6edf3bundle Tff7b72= Te6edf3BundleTb4b4b4(Tb4b4b4)
Te6edf3propertiesTb4b4b4.Te6edf3forEach Tb4b4b4{
Tff7b72val Te6edf3value Tff7b72= Tffa657itTb4b4b4.Te6edf3value
Tff7b72when Tb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72is Tffa657Double Tff7b72-Tff7b72> Te6edf3bundleTb4b4b4.Te6edf3putDoubleTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4)

Tff7b72is Tffa657Int Tff7b72-Tff7b72> Te6edf3bundleTb4b4b4.Te6edf3putLongTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e// Firebase expects Long for integer values in bundles
Tff7b72is Tffa657Long Tff7b72-Tff7b72> Te6edf3bundleTb4b4b4.Te6edf3putLongTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4)

Tff7b72is Tffa657Float Tff7b72-Tff7b72> Te6edf3bundleTb4b4b4.Te6edf3putDoubleTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72is Tffa657String Tff7b72-Tff7b72> Te6edf3bundleTb4b4b4.Te6edf3putStringTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4)

T8b949e// Explicitly handle String
Tff7b72else Tff7b72-Tff7b72> Te6edf3bundleTb4b4b4.Te6edf3putStringTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3valueTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4) T8b949e// Fallback for other types
Tb4b4b4}
Te6edf3KermitLoggerTb4b4b4.Te6edf3withTagTb4b4b4(Te6edf3TAGTb4b4b4)Tb4b4b4.Te6edf3d Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUGTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffAnalytics: track Tffd700$Te6edf3eventTa5d6ff (Tffd700${Tffa657itTb4b4b4.Te6edf3nameTffd700}Ta5d6ff : Tffd700$Te6edf3valueTa5d6ff)Ta5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Ta5d6ff"Ta5d6ffAnalytics: track Tffd700$Te6edf3eventTa5d6ff (Tffd700${Tffa657itTb4b4b4.Te6edf3nameTffd700}Ta5d6ff)Ta5d6ff"
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3FirebaseTb4b4b4.Te6edf3analyticsTb4b4b4.Te6edf3logEventTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3bundleTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.1s